package fr.bordeaux1.planingdesetudiants.controler;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import fr.bordeaux1.planingdesetudiants.controler.db.IDBPlaningDesEtudiants;
import fr.bordeaux1.planingdesetudiants.model.Etudiant;
import fr.bordeaux1.planingdesetudiants.model.Ue;

public class ParserTex {

	private int numeroEtudiant = 1;
	private Map<String, Integer> nbCodeUe;
	private Map<String, Etudiant> etusDejaTrouves;

	public void parseTexEtudiants(IDBPlaningDesEtudiants db, File texfile)
			throws IOException, SQLException {
		BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(texfile),Charset.forName("ISO-8859-1")));
		nbCodeUe = new HashMap<String, Integer>();
		etusDejaTrouves = new HashMap<String, Etudiant>();

		db.beginTransaction();

		Ue ue = null;
		boolean dansListeEtu = false;
		String ligne;

		while ((ligne = input.readLine()) != null) {
			if (ligne.startsWith("\\subsection*{")) {// nouvelle UE commence
				ue = parserUe(ligne);
				System.out.println(ue.getCode());
				db.ajouterUe(ue);
			} else if (ligne.startsWith("\\hline")) {
				// début liste étu
				dansListeEtu = true;
			} else if (ligne.startsWith("\\end{longtable}")) {
				// fin liste étu et donc fin UE
				dansListeEtu = false;
				ue = null;
			} else {
				if (dansListeEtu) {
					// on est en train de lire une liste d'étudiant
					Etudiant etu = parserEtudiant(ligne);
					db.ajouterEtudiantSiInexistant(etu);
					db.ajouterEtudiantAUe(ue, etu);
				} else {
					// ligne osef
				}
			}
		}

		db.endTransaction();
	}

	private Etudiant parserEtudiant(String ligne) {
		if (etusDejaTrouves.containsKey(ligne)) {
			return etusDejaTrouves.get(ligne);
		} else {
			String[] tokens = ligne.split("&");
			Etudiant etu = new Etudiant();
			etu.setNom(tokens[0]);
			etu.setPrenom(tokens[1]);
			etu.setNumero(numeroEtudiant++);
			etusDejaTrouves.put(ligne, etu);
			return etu;
		}
	}

	private Ue parserUe(String ligne) {
		String libeleUe = ligne.substring(ligne.indexOf("{") + 1,
				ligne.indexOf("(")-1);
		String codeUe = ligne.substring(ligne.indexOf("(") + 1,
				ligne.indexOf(")") - 1);
		Integer nb = nbCodeUe.get(codeUe);
		if (nb == null) {
			nb = 1;
		} else {
			nb++;
			codeUe += "-" + nb;
		}
		nbCodeUe.put(codeUe, nb);

		Ue ue = new Ue();
		ue.setCode(codeUe);
		ue.setLibelle(libeleUe);
		return ue;
	}
}
